版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2015/05/12/Spring 使用简单Demo进行源码调试(五)/
访问原文「Spring 使用简单Demo进行源码调试(五)」
接上篇日志Spring 使用简单Demo进行源码调试(四)继续。
还记得refresh()函数嘛,记得也模糊了吧,贴出来好了。其中的第二步 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()已经用大篇幅描述了基本流程。接着看以下几步。
第三步
展开 prepareBeanFactory(beanFactory)。有以下几步:
1. 使内部bean factory使用上下文类加载器等;
2. 使用上下文回调配置bean factory;
3. BeanFactory接口没有在在一个普通的工厂内注册为可解析类型;
4. 检测LoadTimeWeaver并准备织入;
5. 注册默认的环境beans。
|
|
第四步
postProcessBeanFactory(beanFactory)这一步允许子类对bean factory进行后处理,这里没有实现,不用展开。
第五步
invokeBeanFactoryPostProcessors(beanFactory)调用在上下文中作为bean注册的factory处理器。看起来比较复杂的一个方法,做了以下工作
1. 如果存在BeanDefinitionRegistryPostProcessors实例,则进行调用;
2. 寻找BeanFactoryPostProcessors实例,区分PriorityOrdered、Ordered和其他;
3. 调用继承PriorityOrdered的BeanFactoryPostProcessors实例;
4. 调用继承Ordered的BeanFactoryPostProcessors实例;
5. 调用其他BeanFactoryPostProcessors实例。
第六步
registerBeanPostProcessors(beanFactory)注册拦截bean创建的处理器。这一步的步骤与上一部类似,如下,
1. 在BeanPostProcessor实例化的过程中有bean创建,则注册BeanPostProcessorChecker,该类完成对info信息的日志写入;
2. 寻找BeanPostProcessors实例,区分PriorityOrdered、Ordered和其他;
3. 注册继承PriorityOrdered的BeanPostProcessors实例;
4. 注册继承Ordered的BeanPostProcessors实例;
5. 注册其他合格的BeanPostProcessors实例。
6. 重新注册其他内部的BeanPostProcessors实例。
|
|
第七步
initMessageSource()初始化MessageSource, 如果是null,在使用父类的。首先检查是否有MessageSource的定义,有的话,设置其父MessageSource;没有的话使用空MessageSource。
第八步
initApplicationEventMulticaster()初始化ApplicationEventMulticaster,如果没有ApplicationEventMulticaster定义则使用SimpleApplicationEventMulticaster。首先判断是否存在ApplicationEventMulticaster的本定义,存在的话则获取该bean,否则新建一个SimpleApplicationEventMulticaster。
第九步
onRefresh()初始化子类中特殊的bean。这是一个可以被覆盖的添加添加上下文更新工作的模板方法,在单例对象的实例化之前初始化的特殊bean。
第十步
registerListeners()检测监听器bean并注册。
第十一步
finishBeanFactoryInitialization(beanFactory)初始化所有剩余的单例。这个方法比较复杂,下回讨论。
第十二步
finishRefresh()发布相关事件。实际上在我们的demo里这里只做了默认工作,暂不详细说明。
已经将refresh()其余的工作做了简单的分析,真的很复杂的一个框架,其中finishBeanFactoryInitialization(beanFactory)比较复杂,期待下回分析。